package com.juzi.API;

public class Introduce {
    public static void main(String[] args) {
        System.out.println("==========================================\n" +
                "什么是API?\n" +
                "API(Application Programming interface)  应用程序编程接口。\n" +
                "简单来说：就是Java帮我们已经写好的一些方法，我们直接拿过来用就可以了。\n" +
                "-------------------------------\n" +
                "Object类的作用：\n" +
                "   一个类要么默认继承了Object类，要么间接继承了Object类，Object类是Java中的祖宗类。\n" +
                "   Object作为所有类的父类，提供了很多常用的方法给每个子类对象拿来使用。\n" +
                "-------------------------------\n" +
                "Object类的常用方法：\n" +
                "       方法名                                                 说明\n" +
                "public String toString()                   默认是返回当前对象在堆内存中的地址信息:类的全限名@内存地址\n" +
                "public boolean equals(Object o)            默认是比较当前对象与另一个对象的地址是否相同，相同返回true，不同返回false\n" +
                "public String toString()                   默认是返回当前对象在堆内存中的地址信息:类的全限名@内存地址\n" +
                "-------------------------------\n" +
                "问题引出\n" +
                "开发中直接输出对象，默认输出对象的地址其实是毫无意义的。\n" +
                "开发中输出对象变量，更多的时候是希望看到对象的内容数据而不是对象的地址信息。\n" +
                "-------------------------------\n" +
                "toString存在的意义\n" +
                "父类toString()方法存在的意义就是为了被子类重写，以便返回对象的内容信息，而不是地址信息！！ \n" +
                "-------------------------------\n" +
                "Object的toString方法的基本作用是什么，存在的意义是什么？\n" +
                "   基本作用：给子类继承，子类对象调用可以返回自己的地址。\n" +
                "   意义：让子类重写，以便返回子类对象的内容。\n" +
                "-------------------------------\n" +
                "Object的equals方法：\n" +
                "       方法名                                                 说明\n" +
                "public boolean equals(Object o)            默认是比较当前对象与另一个对象的地址是否相同，相同返回true，不同返回false\n" +
                "-------------------------------\n" +
                "问题思考\n" +
                "   直接比较两个对象的地址是否相同完全可以用“==”替代equals。\n" +
                "   同时，开发中很多业务情况下，更想判断2个对象的内容是否一样。\n" +
                "-------------------------------\n" +
                "equals存在的意义\n" +
                "为了被子类重写，以便子类自己来定制比较规则（比如比较对象内容）。\n" +
                "-------------------------------\n" +
                "Object的equals方法的基本作用，存在的意义是什么？\n" +
                "   基本作用：默认是与另一个对象比较地址是否一样\n" +
                "   存在的意义：让子类重写，以便比较对象的内容是否相同。\n" +
                "-------------------------------\n" +
                "Objects概述\n" +
                "   Objects是一个工具类，提供了一些方法去完成一些功能。\n" +
                "-------------------------------\n" +
                "官方在进行字符串比较时，没有用字符串对象的的equals方法，而是选择了Objects的equals方法来比较。\n" +
                "@Override\n" +
                "public boolean equals(Object o) {\n" +
                "    // 1、判断是否是同一个对象比较，如果是返回true。\n" +
                "    if (this == o) return true;\n" +
                "    // 2、如果o是null返回false  如果o不是学生类型返回false  ...Student !=  ..Pig\n" +
                "    if (o == null || this.getClass() != o.getClass()) return false;\n" +
                "    // 3、说明o一定是学生类型而且不为null\n" +
                "    Student student = (Student) o;\n" +
                "    return sex == student.sex && age == student.age && Objects.equals(name, student.name);\n" +
                "}\n" +
                "使用Objects的equals方法在进行对象的比较会更安全。\n" +
                "-------------------------------\n" +
                "Objects的常见方法：\n" +
                "方法名\t\t\t\t\t\t\t\t\t\t\t\t\t\t说明\n" +
                "public static boolean equals(Object a, Object b)\t\t比较两个对象的，底层会先进行非空判断，从而可以避免空指针异常。再进行equals比较\n" +
                "public static boolean isNull(Object obj) \t\t\t\t判断变量是否为null ,为null返回true ,反之\n" +
                "-------------------------------\n" +
                "源码分析\n" +
                "public static boolean equals(Object a, Object b) {\n" +
                "    return (a == b) || (a != null && a.equals(b));\n" +
                "}\n" +
                "-------------------------------\n" +
                "对象进行内容比较的时候建议使用什么？为什么？\n" +
                "建议使用Objects提供的equals方法。\n" +
                "比较的结果是一样的，但是更安全。\n" +
                "-------------------------------\n" +
                "StringBuilder概述\n" +
                "   StringBuilder是一个可变的字符串的操作类，我们可以把它看成是一个对象容器。\n" +
                "   使用StringBuilder的核心作用：操作字符串的性能比String要更高（如拼接、修改等）。\n" +
                "结论：当需要进行字符串操作的时候，应该选择StringBuilder来完成，性能更好\n" +
                "-------------------------------\n" +
                "StringBuilder 构造器\n" +
                "          名称                                     说明\n" +
                "public StringBuilder()                  创建一个空白的可变的字符串对象，不包含任何内容\n" +
                "public StringBuilder(String str)        创建一个指定字符串内容的可变字符串对象\n" +
                "-------------------------------\n" +
                "StringBuilder常用方法\n" +
                "           方法名称                                        说明\n" +
                "public StringBuilder append(任意类型)            添加数据并返回StringBuilder对象本身\n" +
                "public StringBuilder reverse()                 将对象的内容反转\n" +
                "public int length()                            返回对象内容长度\n" +
                "public String toString()                       通过toString()就可以实现把StringBuilder转换为String\n" +
                "-------------------------------\n" +
                "1、为什么拼接、反转字符串建议使用StringBuilder?\n" +
                "   StringBuilder：内容是可变的、拼接字符串性能好、代码优雅。\n" +
                "   String ：内容是不可变的、拼接字符串性能差。\n" +
                "\n" +
                "   定义字符串使用String\n" +
                "   拼接、修改等操作字符串使用StringBuilder\n" +
                "\n" +
                "");
    }
}
